9762 analysis

Andrew Portuguese
January 29, 2024

Setup and data wrangling

Load necessary packages

Show code

Read in the data

Show code
db1 = read_excel(path = "9762 data for analysis 1.29.24.xlsx", sheet = "Survival")

dataset <- db1 %>%
  mutate(
    dx_dt = ymd(dx_dt),
    infuse_dt = ymd(infuse_dt),
    birthdate = ymd(birthdate),
    dt_relapse = ymd(dt_relapse),
    Death.or.DLC = ymd(Death.or.DLC),
    Death.or.relapse.or.DLC = ymd(Death.or.relapse.or.DLC),
    Days.to.death.or.DLC = Death.or.DLC - infuse_dt,
    Days.to.death.or.relapse.or.DLC = Death.or.relapse.or.DLC - infuse_dt,
    Days.from.dx.to.infusion = infuse_dt - dx_dt,
    Age = (infuse_dt-birthdate)/365,
    relapse.or.death = ifelse(relapse == 1 | death == 1,1,0)
  )

Data tables

Table 1 reproduction

Show code
theme_gtsummary_compact()


dataset %>%
  transmute(
    "Age (years)" = Age,
    "Female sex" = ifelse(sex == "f", 1, 0),
    "Race" = recode(race, "asian" = "Asian", "white" = "White"),
    "ECOG performance status" = ecog,
    "Median time from diagnosis to CAR T cell therapy" = Days.from.dx.to.infusion/365,
    "Disease subtype" = factor(subtype_category, levels = c("IgA", "IgG", "IgM", "Light chain", "Oligosecretory", "Primary plasma cell leukemia")),
    "ISS disease stage at diagnosis" = iss,
    "Revised ISS disease stage at diagnosis" = riss,
    "ISS disease stage at enrollment" = iss_enrollment,
    "Revised ISS disease stage at enrollment" = riss_enrollment,
    "High-risk cytogenetic abnormality at any time" = HRCA,
    "t(4;14) any" = t414_any,
    "t(14;16) any" = t1416_any,
    "del(17p) any" = del17p_any,
    #"amp(1q) any" = amp1q_any,
    "High bone marrow tumor burden" = ifelse(High.tumor.burden == 1, ">30%", "10-30%"),
    "Extramedullary disease" = extramedullary,
    "Circulating plasma cells at screening" = cpcs,
    "Tumor BCMA expression (ABC)" = bcma_scrn,
    "Number of previous antimyeoma regimens" = factor(case_when(
      no_priortx <=6 ~ "4-6",
      no_priortx >6 & no_priortx <=9 ~ "7-9",
      no_priortx >9 ~ "10 or more"), levels = c("4-6", "7-9", "10 or more") ),
    "Previous autologous HCT" = factor(case_when(
      no_auto == 0 ~ "0",
      no_auto == 1 ~ "1",
      no_auto >1 ~ ">1"), levels = c("0","1",">1") ),
    "Previous allogeneic HCT" = allo
  ) %>%
  
  tbl_summary(
    missing = "ifany",
    statistic = list(
      all_continuous() ~ "{median} ({min} to {max})",
      all_categorical() ~ "{n} ({p}%)"
    )
  ) %>%
  bold_labels() %>%
  add_variable_grouping(
    "High-risk cytogenetic abnormality at any time" = c("t(4;14) any", "t(14;16) any", "del(17p) any", "amp(1q) any")
  )
Characteristic N = 251
Age (years) 64 (38 to 77)
Female sex 9 (36%)
Race
    Asian 3 (12%)
    White 22 (88%)
ECOG performance status
    0 5 (20%)
    1 17 (68%)
    2 3 (12%)
Median time from diagnosis to CAR T cell therapy 5.1 (1.6 to 14.6)
Disease subtype
    IgA 4 (16%)
    IgG 13 (52%)
    IgM 2 (8.0%)
    Light chain 3 (12%)
    Oligosecretory 1 (4.0%)
    Primary plasma cell leukemia 2 (8.0%)
ISS disease stage at diagnosis
    1 4 (20%)
    2 6 (30%)
    3 10 (50%)
    Unknown 5
Revised ISS disease stage at diagnosis
    1 2 (18%)
    2 3 (27%)
    3 6 (55%)
    Unknown 14
ISS disease stage at enrollment
    1 12 (63%)
    2 5 (26%)
    3 2 (11%)
    Unknown 6
Revised ISS disease stage at enrollment
    1 6 (32%)
    2 11 (58%)
    3 2 (11%)
    Unknown 6
High-risk cytogenetic abnormality at any time 14 (56%)
High-risk cytogenetic abnormality at any time
    t(4;14) any 2 (8.0%)
    t(14;16) any 2 (8.0%)
    del(17p) any 13 (52%)
High bone marrow tumor burden
    >30% 17 (68%)
    10-30% 8 (32%)
Extramedullary disease 11 (44%)
Circulating plasma cells at screening 5 (20%)
Tumor BCMA expression (ABC) 620 (175 to 5,521)
Number of previous antimyeoma regimens
    4-6 6 (24%)
    7-9 13 (52%)
    10 or more 6 (24%)
Previous autologous HCT
    0 5 (20%)
    1 13 (52%)
    >1 7 (28%)
Previous allogeneic HCT 5 (20%)
1 Median (Range); n (%)

Swimmer’s plot

Figure 1: Swimmer’s plot

Show code
swimmer_data = as.data.frame(read_excel(path = "9762 swimmer.xlsx", sheet = "Response")) %>%
  mutate(
    Response_start = Response_start/30,
    Response_end = Response_end/30,
    Arrow_start = Arrow_start/30,
    Time = Time/30,
    Response = factor(Response, levels=c("PD","sCR","CR","VGPR","PR","SD"))
  )

pastel1_palette <- brewer.pal(8, "Pastel1")[1:6]


swimmer_plot(df=filter(swimmer_data, !is.na(Response) ), 
            id="Number", 
            end= "Response_end", 
            name_fill="Response",
            stratify = "Dose_level",
            ) +
  scale_fill_manual(values = pastel1_palette) +
  swimmer_arrows(df_arrows = filter(swimmer_data,!is.na(Arrow_start) ),id="Number",arrow_start="Arrow_start", name_col = 'Response', type = "open", cex=1, arrow_positions = c(1,5)) + 
  swimmer_points(df_points= filter(swimmer_data,!is.na(Event) ) ,id='Number',name_shape = "Event", time='Time',size=2,fill='white',col="black") +
  scale_y_continuous(name = "Time since infusion (Months)",breaks = seq(0,10000,by=12)) +
  guides(fill = guide_legend(title = "Response"), colour = FALSE)  # Hide the legend for arrows

Supplemental figure

sBCMA plots

Show code
sBCMA_data = as.data.frame(read_excel(path = "sBCMA data.xlsx"))


ggplot(sBCMA_data, aes(x = timepoint/30, y = sBCMA, color = Tumor.burden)) +
  geom_point(shape = 16, size = 2) +
  theme_classic() +
  labs(x = "Time (months)", y = "sBCMA") +
  scale_color_discrete(name = "Tumor burden") +
  facet_wrap(~Number, scales = "free_y", ncol = 5) +  # Facet by the "Number" variable with free y-axes and 2 columns
  scale_y_log10(limits = c(0.01, 10000)) +
  scale_x_continuous(breaks = seq(0, 48, by = 12)) +
  theme(strip.text = element_text(size = 9)) + 
  geom_vline(aes(xintercept = Relapse.time/30), linetype = "dashed", color = "black")  # Add vertical line

Survival analysis

Length of follow-up

Show code
data1 = dataset %>%
  mutate(
    Reverse_death = ifelse(death == 1, 0,1)
  )

#quantile(prodlim(Hist(time = Real.days.DLC/30, Real.death )~1, data = data1, reverse = TRUE ) )


reverse_km_OS <- survfit(Surv(Days.to.death.or.DLC/30, Reverse_death) ~ 1, data1)
reverse_km_OS
Call: survfit(formula = Surv(Days.to.death.or.DLC/30, Reverse_death) ~ 
    1, data = data1)

      n events median 0.95LCL 0.95UCL
[1,] 25      6   58.6    47.4      NA

Create KM for OS and PFS

Show code
km_OS <- survfit(Surv(Days.to.death.or.DLC/30, death) ~ 1, data = dataset)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
) 

OS$plot <- OS$plot + geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") +  annotate("text", x = med_OS$median + 0.5, y = 0.54, label = paste(signif(med_OS$median, 2), "(95% CI, ", signif(med_OS$lower, 2), "to", signif(med_OS$upper, 2),")"), hjust = 0,  size = 5)
OS
Show code
km_OS
Call: survfit(formula = Surv(Days.to.death.or.DLC/30, death) ~ 1, data = dataset)

      n events median 0.95LCL 0.95UCL
[1,] 25     19   32.1    20.4      NA
Show code
summary(km_OS,times=c(12))
Call: survfit(formula = Surv(Days.to.death.or.DLC/30, death) ~ 1, data = dataset)

 time n.risk n.event survival std.err lower 95% CI upper 95% CI
   12     22       3     0.88   0.065        0.761            1
Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse.or.death) ~ 1, data = dataset)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS$plot <- PFS$plot + geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") +  annotate("text", x = med_PFS$median + 0.5, y = 0.54, label = paste(signif(med_PFS$median, 2), "(95% CI, ", signif(med_PFS$lower, 2), "to", signif(med_PFS$upper, 2),")"), hjust = 0,  size = 5)
PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse.or.death) ~ 1, data = dataset)

      n events median 0.95LCL 0.95UCL
[1,] 25     24   15.5    8.73    27.1
Show code
summary(km_PFS,times=c(12))
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse.or.death) ~ 1, data = dataset)

 time n.risk n.event survival std.err lower 95% CI upper 95% CI
   12     16       9     0.64   0.096        0.477        0.859

PFS and OS on the same plot

Show code
OS_EFS <- ggsurvplot_combine(list(km_PFS, km_OS),
           data=dataset,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.3,
           tables.theme = theme_cleantable(),
           surv.median.line = "hv", # Specify median survival
           ggtheme = theme_classic()+
            theme(
              axis.text.x = element_text(size = 12),  # Increase x-axis label font size
              axis.text.y = element_text(size = 12),  # Increase y-axis label font size
              axis.title.x = element_text(size = 14),  # Increase x-axis title font size
              axis.title.y = element_text(size = 14),  # Increase y-axis title font size
              plot.title = element_text(size = 12),    # Increase plot title font size
              legend.text = element_text(size = 12),    # Increase legend text font size
              legend.title = element_text(size = 12)    # Increase legend title font size
            ),
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "PFS & OS (%)",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           #fun=formula,
           legend.labs = c("PFS","OS"),
           surv.scale = "percent",
           censor=FALSE
           )

OS_EFS$plot <- OS_EFS$plot + 
  geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") + 
  geom_vline(xintercept = median(km_OS)[1], linetype = "dashed", color = "grey") + 
  geom_vline(xintercept = median(km_PFS)[1], linetype = "dashed", color = "grey") + 
  annotate("text", x = med_OS$median + 0.5, y = 0.85, label = paste(signif(med_OS$median, 2), "(", signif(med_OS$lower, 2), "-", signif(med_OS$upper, 2),")"), hjust = 0,  size = 5) +
  annotate("text", x = med_PFS$median + 0.5, y = 0.95, label = paste(signif(med_PFS$median, 2), "(", signif(med_PFS$lower, 2), "-", signif(med_PFS$upper, 2),")"), hjust = 0,  size = 5)

OS_EFS

Create KM for DOR

Show code
km_DOR <- survfit(Surv((Days.to.death.or.relapse.or.DLC-28)/30, relapse.or.death) ~ 1, data = dataset)
med_DOR <- surv_median(km_DOR)

DOR <- ggsurvplot(km_DOR,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Duration of response",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

DOR$plot <- DOR$plot + geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") +  annotate("text", x = med_DOR$median + 0.5, y = 0.54, label = paste(signif(med_DOR$median, 2), "(95% CI, ", signif(med_DOR$lower, 2), "to", signif(med_DOR$upper, 2),")"), hjust = 0,  size = 5)
DOR
Show code
km_DOR
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 28)/30, 
    relapse.or.death) ~ 1, data = dataset)

      n events median 0.95LCL 0.95UCL
[1,] 25     24   14.6     7.8    26.2
Show code
summary(km_DOR,times=c(12))
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 28)/30, 
    relapse.or.death) ~ 1, data = dataset)

 time n.risk n.event survival std.err lower 95% CI upper 95% CI
   12     14      11     0.56  0.0993        0.396        0.793

Stratified survival analysis

Create KM for OS and PFS, stratify by HRCA

Show code
km_OS <- survfit(Surv(Days.to.death.or.DLC/30, death) ~ HRCA, data = dataset)
km_OS
Call: survfit(formula = Surv(Days.to.death.or.DLC/30, death) ~ HRCA, 
    data = dataset)

        n events median 0.95LCL 0.95UCL
HRCA=0 11      8   33.0    25.4      NA
HRCA=1 14     11   22.8    17.7      NA
Show code
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black"),
           legend.labs = c("Standard","High risk")
) 

#OS$plot <- OS$plot + geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") +  annotate("text", x = med_OS$median + 0.5, y = 0.54, label = paste("Median =", signif(med_OS$median, 2), "(95% CI, ", signif(med_OS$lower, 2), "to", signif(med_OS$upper, 2),")"), hjust = 0,  size = 5)

OS
Show code
km_PFS <- survfit(Surv(Days.to.death.or.relapse.or.DLC/30, relapse.or.death) ~ HRCA, data = dataset)
km_PFS
Call: survfit(formula = Surv(Days.to.death.or.relapse.or.DLC/30, relapse.or.death) ~ 
    HRCA, data = dataset)

        n events median 0.95LCL 0.95UCL
HRCA=0 11     10   23.2    8.07      NA
HRCA=1 14     14   13.3    8.73    27.5
Show code
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black"),
           legend.labs = c("Standard","High risk")
)

#PFS$plot <- PFS$plot + geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") +  annotate("text", x = med_PFS$median + 0.5, y = 0.54, label = paste("Median =", signif(med_PFS$median, 2), "(95% CI, ", signif(med_PFS$lower, 2), "to", signif(med_PFS$upper, 2),")"), hjust = 0,  size = 5)

PFS

KM of OS & PFS, stratified by cell dose

Show code
km_PFS <- survfit(Surv(Days.to.death.or.relapse.or.DLC/30, relapse.or.death) ~ intended_cell_dose, data = dataset)
km_PFS
Call: survfit(formula = Surv(Days.to.death.or.relapse.or.DLC/30, relapse.or.death) ~ 
    intended_cell_dose, data = dataset)

                                        n events median 0.95LCL
intended_cell_dose=Dose level 1 - 50E6  7      7  15.50    5.87
intended_cell_dose=Dose level 2 - 150E6 8      7  24.32   12.20
intended_cell_dose=Dose level 3 - 300E6 7      7  23.20   12.63
intended_cell_dose=Dose level 4 - 450E6 3      3   7.87    3.07
                                        0.95UCL
intended_cell_dose=Dose level 1 - 50E6       NA
intended_cell_dose=Dose level 2 - 150E6      NA
intended_cell_dose=Dose level 3 - 300E6      NA
intended_cell_dose=Dose level 4 - 450E6      NA
Show code
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.4,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black"),
           #legend.labs = c("Standard","High risk")
)

PFS
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ intended_cell_dose, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.4,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ intended_cell_dose, 
    data = data1)

                                        n events median 0.95LCL
intended_cell_dose=Dose level 1 - 50E6  7      7   25.4    10.1
intended_cell_dose=Dose level 2 - 150E6 8      4   58.4    27.5
intended_cell_dose=Dose level 3 - 300E6 7      5   32.1    20.4
intended_cell_dose=Dose level 4 - 450E6 3      3   18.5    16.6
                                        0.95UCL
intended_cell_dose=Dose level 1 - 50E6       NA
intended_cell_dose=Dose level 2 - 150E6      NA
intended_cell_dose=Dose level 3 - 300E6      NA
intended_cell_dose=Dose level 4 - 450E6      NA

KM of PFS, dose level 1-3 vs 4

Show code
data1 <- dataset %>%
  mutate(
    dose_level = ifelse(intended_cell_dose == "Dose level 1 - 50E6","1","2-4")
  )

km_PFS <- survfit(Surv(Days.to.death.or.relapse.or.DLC/30, relapse.or.death) ~ dose_level, data = data1)
km_PFS
Call: survfit(formula = Surv(Days.to.death.or.relapse.or.DLC/30, relapse.or.death) ~ 
    dose_level, data = data1)

                n events median 0.95LCL 0.95UCL
dose_level=1    7      7   15.5    5.87      NA
dose_level=2-4 18     17   17.5    8.73    31.7
Show code
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,60), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Level 1-3","Level 4"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black"),
           pval.coord = c(47, 0.8)
)
PFS

Create KM for OS, stratified by sCR/CR vs VGPR/PR

Show code
data1 <- dataset %>%
  mutate(
    response.category = recode(best_response, "scr" = "sCR/CR", "cr" = "sCR/CR", "vgpr" = "VGPR/PR", "pr"="VGPR/PR")
  )

km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ response.category, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("sCR/CR","VGPR/PR"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ response.category, 
    data = data1)

                           n events median 0.95LCL 0.95UCL
response.category=sCR/CR  17     12   36.0    27.5      NA
response.category=VGPR/PR  8      7   19.1    17.1      NA
Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC-28)/30, relapse.or.death) ~ response.category, data = data1)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           xlab="Time (months)", ylab = "Duration of response",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("sCR/CR","VGPR/PR"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 28)/30, 
    relapse.or.death) ~ response.category, data = data1)

                           n events median 0.95LCL 0.95UCL
response.category=sCR/CR  17     16  20.20   14.57    27.3
response.category=VGPR/PR  8      8   7.28    6.93      NA

Create KM for OS & PFS, stratified by treatment lines <8 vs >=8

Show code
data1 <- dataset %>%
  mutate(
    prior.lines.8 = ifelse(no_priortx >=8, 1,0)
  )

km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse.or.death) ~ prior.lines.8, data = data1)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("<8","\u22658"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse.or.death) ~ prior.lines.8, data = data1)

                 n events median 0.95LCL 0.95UCL
prior.lines.8=0 11     10   12.6    8.37      NA
prior.lines.8=1 14     14   19.6   12.20    31.7
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ prior.lines.8, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("<8","\u22658"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ prior.lines.8, 
    data = data1)

                 n events median 0.95LCL 0.95UCL
prior.lines.8=0 11      7   20.4    17.7      NA
prior.lines.8=1 14     12   33.0    25.4      NA

Create KM for OS & PFS, stratified by hx of prior allo

Show code
data1 <- dataset %>%
  mutate(
    prior.lines.8 = ifelse(no_priortx >=8, 1,0)
  )

km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse.or.death) ~ allo, data = data1)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse.or.death) ~ allo, data = data1)

        n events median 0.95LCL 0.95UCL
allo=0 20     19   16.0    8.07    28.2
allo=1  5      5   15.5   12.20      NA
Show code
#summary(km_PFS,times=c(12))


km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ allo, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ allo, 
    data = data1)

        n events median 0.95LCL 0.95UCL
allo=0 20     15   27.5    20.4      NA
allo=1  5      4   61.5    17.7      NA
Show code
#summary(km_OS,times=c(12))

Create KM for OS & PFS, stratified by PCL

Show code
data1 <- dataset %>%
  mutate(
    prior.lines.8 = ifelse(no_priortx >=8, 1,0)
  )

km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse.or.death) ~ PCL, data = data1)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse.or.death) ~ PCL, data = data1)

       n events median 0.95LCL 0.95UCL
PCL=0 23     22  18.00   12.20    27.5
PCL=1  2      2   6.45    4.53      NA
Show code
#summary(km_PFS,times=c(12))


km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ PCL, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ PCL, 
    data = data1)

       n events median 0.95LCL 0.95UCL
PCL=0 23     17   33.0   22.80      NA
PCL=1  2      2   11.9    6.07      NA
Show code
#summary(km_OS,times=c(12))

Create KM for OS & PFS, stratified by receipt of prior BCMA-directed therapy

Show code
data1 <- dataset %>%
  mutate(
    prior.lines.8 = ifelse(no_priortx >=8, 1,0)
  )

km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse.or.death) ~ any_bcma_tx, data = data1)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse.or.death) ~ any_bcma_tx, data = data1)

               n events median 0.95LCL 0.95UCL
any_bcma_tx=0 22     21   16.8    8.73    27.5
any_bcma_tx=1  3      3   12.2    5.87      NA
Show code
summary(km_PFS,times=c(12))
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse.or.death) ~ any_bcma_tx, data = data1)

                any_bcma_tx=0 
        time       n.risk      n.event     survival      std.err 
      12.000       14.000        8.000        0.636        0.103 
lower 95% CI upper 95% CI 
       0.464        0.873 

                any_bcma_tx=1 
        time       n.risk      n.event     survival      std.err 
      12.000        2.000        1.000        0.667        0.272 
lower 95% CI upper 95% CI 
       0.300        1.000 
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ any_bcma_tx, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ any_bcma_tx, 
    data = data1)

               n events median 0.95LCL 0.95UCL
any_bcma_tx=0 22     17   27.5    20.4      NA
any_bcma_tx=1  3      2   32.1    10.1      NA
Show code
summary(km_OS,times=c(12))
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ any_bcma_tx, 
    data = data1)

                any_bcma_tx=0 
        time       n.risk      n.event     survival      std.err 
     12.0000      20.0000       2.0000       0.9091       0.0613 
lower 95% CI upper 95% CI 
      0.7966       1.0000 

                any_bcma_tx=1 
        time       n.risk      n.event     survival      std.err 
      12.000        2.000        1.000        0.667        0.272 
lower 95% CI upper 95% CI 
       0.300        1.000 

Create KM for OS & PFS, stratified by triple refractory disease

Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse.or.death) ~ triple_ref, data = dataset)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse.or.death) ~ triple_ref, data = dataset)

              n events median 0.95LCL 0.95UCL
triple_ref=0  5      5   12.2    8.37      NA
triple_ref=1 20     19   16.8    8.73    27.5
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ triple_ref, data = dataset)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ triple_ref, 
    data = dataset)

              n events median 0.95LCL 0.95UCL
triple_ref=0  5      4   27.5    18.5      NA
triple_ref=1 20     15   32.1    20.4      NA

Create KM for OS & PFS, stratified by penta refractory disease

Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse.or.death) ~ pentaref, data = dataset)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse.or.death) ~ pentaref, data = dataset)

            n events median 0.95LCL 0.95UCL
pentaref=0  8      8   16.0   12.20      NA
pentaref=1 17     16   15.5    8.07    27.5
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ triple_ref, data = dataset)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ triple_ref, 
    data = dataset)

              n events median 0.95LCL 0.95UCL
triple_ref=0  5      4   27.5    18.5      NA
triple_ref=1 20     15   32.1    20.4      NA

Create KM for OS & PFS, stratified by tumor burden (BMPCs <=30 vs >30)

Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse.or.death) ~ High.tumor.burden, data = dataset)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse.or.death) ~ High.tumor.burden, data = dataset)

                     n events median 0.95LCL 0.95UCL
High.tumor.burden=0  8      7   24.3   18.00      NA
High.tumor.burden=1 17     17   12.6    8.37    26.4
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ High.tumor.burden, data = dataset)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ High.tumor.burden, 
    data = dataset)

                     n events median 0.95LCL 0.95UCL
High.tumor.burden=0  8      5   48.6    33.0      NA
High.tumor.burden=1 17     14   22.8    17.7      NA

Create KM for OS & PFS, stratified by sBCMA at day 90 (< vs >= median)

Show code
data1 <- dataset %>%
  filter(!is.na(sBCMA.d90))%>%
  filter(Days.to.death.or.relapse.or.DLC>=90) %>%
  mutate(
    sBCMA.high = ifelse(sBCMA.d90 >= median(sBCMA.d90),1,0)
  )

median(data1$sBCMA.d90)
[1] 2.915
Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC-90)/30, relapse.or.death) ~ sBCMA.high, data = data1)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 90)/30, 
    relapse.or.death) ~ sBCMA.high, data = data1)

              n events median 0.95LCL 0.95UCL
sBCMA.high=0 10     10  21.80   15.00      NA
sBCMA.high=1 10      9   7.28    4.33      NA
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC-90)/30, death) ~ sBCMA.high, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC - 90)/30, death) ~ 
    sBCMA.high, data = data1)

              n events median 0.95LCL 0.95UCL
sBCMA.high=0 10      7   55.4    30.0      NA
sBCMA.high=1 10      8   18.5    12.5      NA

Create KM for OS & PFS, stratified by sBCMA at day 60 (< vs >= median)

Show code
data1 <- dataset %>%
  filter(!is.na(sBCMA.d60))%>%
  filter(Days.to.death.or.relapse.or.DLC>=60) %>%
  mutate(
    sBCMA.high = ifelse(sBCMA.d60 >= median(sBCMA.d60),1,0)
  )

median(data1$sBCMA.d60)
[1] 5.415
Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC-60)/30, relapse.or.death) ~ sBCMA.high, data = data1)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 60)/30, 
    relapse.or.death) ~ sBCMA.high, data = data1)

              n events median 0.95LCL 0.95UCL
sBCMA.high=0 12     12   20.2   10.63      NA
sBCMA.high=1 12     11   11.1    6.07      NA
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC-60)/30, death) ~ sBCMA.high, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC - 60)/30, death) ~ 
    sBCMA.high, data = data1)

              n events median 0.95LCL 0.95UCL
sBCMA.high=0 12      8   34.0    30.1      NA
sBCMA.high=1 12     10   17.1    13.5      NA

Create KM for OS & PFS, stratified by BCMA ABC at screening

Show code
data1 <- dataset %>%
  filter(!is.na(bcma_scrn))%>%
  filter(Days.to.death.or.relapse.or.DLC>=60) %>%
  mutate(
    BCMA.high = ifelse(bcma_scrn >= median(bcma_scrn),1,0)
  )

median(data1$bcma_scrn)
[1] 620
Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse.or.death) ~ BCMA.high, data = data1)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse.or.death) ~ BCMA.high, data = data1)

             n events median 0.95LCL 0.95UCL
BCMA.high=0 12     12   13.3    8.07      NA
BCMA.high=1 13     12   21.1    8.37      NA
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ BCMA.high, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ BCMA.high, 
    data = data1)

             n events median 0.95LCL 0.95UCL
BCMA.high=0 12      8   22.8    18.5      NA
BCMA.high=1 13     11   36.0    17.7      NA

Regression analysis

Cox regression

Show code
theme_gtsummary_compact()
preds <- c("HRCA", "cnLOH", "response.category", "intended_cell_dose", "High.tumor.burden","any_bcma_tx","pentaref","triple_ref","bcma_scrn", "sBCMA.d90", "sBCMA.d60", "sbcma_nadir","sbcma_nadir_timepoint")

data1 <- dataset %>%
  mutate(
    response.category = recode(best_response, "scr" = "sCR/CR", "cr" = "sCR/CR", "vgpr" = "VGPR/PR", "pr"="VGPR/PR"),
    sBCMA.d90 = sBCMA.d90 /10,
    sBCMA.d60 = sBCMA.d60 / 10,
    sbcma_nadir = sbcma_nadir / 10,
    bcma_scrn = log10(bcma_scrn)
  )


uv_tab_OS <- tbl_uvregression(
  data1[c(preds)],
  method = coxph,
  y = Surv(data1$Days.to.death.or.DLC, data1$death),
  exponentiate = TRUE
) %>%
  sort_p()

uv_tab_PFS <- tbl_uvregression(
  data1[c(preds)],
  method = coxph,
  y = Surv(data1$Days.to.death.or.relapse.or.DLC, data1$relapse.or.death),
  exponentiate = TRUE
)


tbl_merge(list(uv_tab_OS, uv_tab_PFS), tab_spanner = c("**OS**", "**PFS**"))
Characteristic OS PFS
N HR1 95% CI1 p-value N HR1 95% CI1 p-value
sBCMA.d90 21 3.21 1.39, 7.42 0.006 21 2.77 1.11, 6.89 0.029
sBCMA.d60 24 1.50 1.12, 2.02 0.007 24 1.56 1.09, 2.24 0.015
sbcma_nadir 22 1.42 1.05, 1.93 0.024 22 1.64 1.00, 2.68 0.049
response.category 25


25


    sCR/CR



    VGPR/PR
3.28 1.16, 9.25 0.025
1.89 0.78, 4.58 0.2
High.tumor.burden 25 2.87 0.93, 8.91 0.067 25 2.76 0.99, 7.71 0.052
bcma_scrn 25 0.21 0.03, 1.58 0.13 25 0.43 0.08, 2.22 0.3
intended_cell_dose 25


25


    Dose level 1 - 50E6



    Dose level 2 - 150E6
0.53 0.14, 1.98 0.3
0.30 0.09, 0.98 0.047
    Dose level 3 - 300E6
1.04 0.29, 3.74 >0.9
0.39 0.13, 1.23 0.11
    Dose level 4 - 450E6
2.96 0.62, 14.1 0.2
2.79 0.63, 12.4 0.2
sbcma_nadir_timepoint 22 1.00 0.99, 1.00 0.4 22 1.00 0.99, 1.00 0.5
cnLOH 22 1.23 0.42, 3.59 0.7 22 0.86 0.33, 2.23 0.8
pentaref 25 0.90 0.33, 2.45 0.8 25 0.81 0.34, 1.95 0.6
triple_ref 25 0.89 0.29, 2.75 0.8 25 0.71 0.26, 1.94 0.5
any_bcma_tx 25 1.12 0.25, 4.97 0.9 25 1.85 0.53, 6.48 0.3
HRCA 25 1.01 0.39, 2.65 >0.9 25 2.08 0.85, 5.10 0.11
1 HR = Hazard Ratio, CI = Confidence Interval

Scatterplot

TTR by BCMA ABC at baseline in relapsed patients

Show code
data1 <- dataset %>%
  filter(relapse == 1) %>%
  transmute(
    bcma_scrn = log(bcma_scrn),
    time.to.relapse = Days.to.death.or.relapse.or.DLC/30
  )

ggplot(data1, aes(x=time.to.relapse, y = bcma_scrn)) + 
  geom_point(shape = 16) + # Add points to the plot with shape 16 (i.e., basic circle)
  theme_classic() + # Use the minimal theme
  geom_smooth(aes(x = time.to.relapse, y=bcma_scrn), method = "lm", se = TRUE, color = "#104a8e", inherit.aes = FALSE, linetype = "solid", linewidth = 0.5)+
  stat_cor(method = "pearson", label.x = 3, label.y = 9) +
  labs(x = "Time to relapse (months)", y = "log(BCMA ABC)")

Probability plots

Hazard of OS/PFS vs sBCMA d90

Show code
data1 <- dataset %>%
  select(sBCMA.d90, Days.to.death.or.DLC, death, Days.to.death.or.relapse.or.DLC, relapse.or.death)

dd <- datadist(data1)
options(datadist='dd')



fit1 <- cph(Surv(data1$Days.to.death.or.DLC, data1$death) ~ sBCMA.d90, data=data1)
df1 <- data.frame(Predict(fit1, sBCMA.d90, fun=function(x) exp(x) ) )


fit2 <- cph(Surv(data1$Days.to.death.or.relapse.or.DLC, data1$relapse.or.death) ~ sBCMA.d90, data=data1)
df2 <- data.frame(Predict(fit2, sBCMA.d90, fun=function(x) exp(x) ) )

ggplot() + 
  geom_line(data=df1, aes(x=sBCMA.d90,y=yhat, color = "OS")) + geom_ribbon( data=df1, aes(x=sBCMA.d90,ymin=lower, ymax=upper),alpha=0.10)+
  geom_line(data=df2, aes(x=sBCMA.d90,y=yhat, color ="PFS" )) + geom_ribbon(data = df2, aes(x=sBCMA.d90,ymin=lower, ymax=upper),alpha=0.10)+
  labs(x = "sBCMA d90",
       y = "Hazard")+
  theme_classic() +
  scale_y_continuous(breaks=c(1,2,3,4,5,6,7,8, 9)) + 
  #scale_x_continuous(breaks=c(0.25,0.5,0.75,1.0,1.25,1.5,1.75), limits=c(0.25, 1.75)) + 
  theme(legend.position = c(0, 1),legend.justification = c(-7.5, 1.1))+
  scale_color_manual(values = c ("steelblue","coral2")) + 
  theme(title = element_text(size=20,face="bold"),legend.title=element_blank())

Hazard of OS/PFS vs screening BCMA ABC

Show code
data1 <- dataset %>%
  select(bcma_scrn, Days.to.death.or.DLC, death, Days.to.death.or.relapse.or.DLC, relapse.or.death)

dd <- datadist(data1)
options(datadist='dd')



fit1 <- cph(Surv(data1$Days.to.death.or.DLC, data1$death) ~ rcs(bcma_scrn,3), data=data1)
df1 <- data.frame(Predict(fit1, bcma_scrn, fun=function(x) exp(x) ) )


fit2 <- cph(Surv(data1$Days.to.death.or.relapse.or.DLC, data1$relapse.or.death) ~ rcs(bcma_scrn,3), data=data1)
df2 <- data.frame(Predict(fit2, bcma_scrn, fun=function(x) exp(x) ) )

ggplot() + 
  geom_line(data=df1, aes(x=bcma_scrn,y=yhat, color = "OS")) + geom_ribbon( data=df1, aes(x=bcma_scrn,ymin=lower, ymax=upper),alpha=0.10)+
  geom_line(data=df2, aes(x=bcma_scrn,y=yhat, color ="PFS" )) + geom_ribbon(data = df2, aes(x=bcma_scrn,ymin=lower, ymax=upper),alpha=0.10)+
  labs(x = "BCMA screen",
       y = "Hazard")+
  theme_classic() +
  theme(legend.position = c(0, 1),legend.justification = c(-7.5, 1.1))+
  scale_color_manual(values = c ("steelblue","coral2")) + 
  theme(title = element_text(size=20,face="bold"),legend.title=element_blank())

Hazard of PFS vs screening BCMA ABC

Show code
data1 <- dataset %>%
  select(bcma_scrn, Days.to.death.or.relapse.or.DLC, relapse.or.death)



dd <- datadist(data1)
options(datadist='dd')

S <- Surv(data1$Days.to.death.or.relapse.or.DLC, data1$relapse.or.death)
f <- cph(S ~ rcs(bcma_scrn,3), x=TRUE, y=TRUE,surv=TRUE,data=data1)

model <- Predict(f, bcma_scrn, fun=function(x) exp(x) )

ggplot(as.data.frame(model),aes(x=bcma_scrn, y=yhat)) + 
  geom_ribbon(data = model, aes(ymin=lower, ymax=upper), alpha=0.2, linetype=0) + 
  geom_line() + 
  theme_bw() + 
  labs(
    x = "Screening BCMA",
    y = "PFS (hazard)") +
  theme(title = element_text(size=16,face="bold"),legend.title=element_blank())

Hazard of PFS vs sBCMA nadir

Show code
data1 <- dataset %>%
  select(sbcma_nadir, Days.to.death.or.relapse.or.DLC, relapse.or.death) %>%
  filter(!is.na(sbcma_nadir))



dd <- datadist(data1)
options(datadist='dd')

S <- Surv(data1$Days.to.death.or.relapse.or.DLC, data1$relapse.or.death)
f <- cph(S ~ sbcma_nadir, x=TRUE, y=TRUE,surv=TRUE,data=data1)

model <- Predict(f, sbcma_nadir, fun=function(x) exp(x) )

ggplot(as.data.frame(model),aes(x=sbcma_nadir, y=yhat)) + 
  geom_ribbon(data = model, aes(ymin=lower, ymax=upper), alpha=0.2, linetype=0) + 
  geom_line() + 
  theme_bw() + 
  labs(
    x = "sBCMA nadir",
    y = "PFS (hazard)") +
  theme(title = element_text(size=16,face="bold"),legend.title=element_blank())

Hazard of PFS vs time to sBCMA nadir

Show code
data1 <- dataset %>%
  select(sbcma_nadir_timepoint, Days.to.death.or.relapse.or.DLC, relapse.or.death) %>%
  filter(!is.na(sbcma_nadir_timepoint))



dd <- datadist(data1)
options(datadist='dd')

S <- Surv(data1$Days.to.death.or.relapse.or.DLC, data1$relapse.or.death)
f <- cph(S ~ sbcma_nadir_timepoint, x=TRUE, y=TRUE,surv=TRUE,data=data1)

model <- Predict(f, sbcma_nadir_timepoint, fun=function(x) exp(x) )

ggplot(as.data.frame(model),aes(x=sbcma_nadir_timepoint, y=yhat)) + 
  geom_ribbon(data = model, aes(ymin=lower, ymax=upper), alpha=0.2, linetype=0) + 
  geom_line() + 
  theme_bw() + 
  labs(
    x = "Time to sBCMA nadir (days)",
    y = "PFS (hazard)") +
  theme(title = element_text(size=16,face="bold"),legend.title=element_blank())